17 实践课-智能分拣产线场景建模
- 智能分拣产线场景建模
关联:索引
- 先修:已完成 Gazebo Fortress 安装验证与最小 world 运行;了解 SDF/URDF 基本结构;会查看终端日志定位解析错误(前置已覆盖)。
- 推荐系统:Ubuntu 22.04;ROS2 Humble(用于后续扩展与可选验证)。
- 本主线:以 SDF/
.world组织整线场景;UR5e 若来自 URDF,则以“关节限位/运动学参数校准”为重点(不要求本节课完成完整控制链路)。
本次实践目录组织(建议统一,便于排错与提交)
建议在任意工作目录创建一个“可交付”的场景工程目录:
mkdir -p sorting_line_scene/{worlds,models,docs}
逐行解释:
mkdir -p ...:一次性创建目录结构,避免素材散落导致资源路径混乱。{worlds,models,docs}:这是 Bash 的花括号展开语法;如果你的终端不是 Bash(或你在脚本里用的是更精简的sh),请分别执行mkdir -p sorting_line_scene/worlds等命令。worlds/:放.world/.sdf场景文件。models/:放自建或拷贝的设备模型(UR5e/传送带/AGV/苹果)。
资源路径建议(让 Gazebo 找得到 models/):
export GZ_SIM_RESOURCE_PATH=$GZ_SIM_RESOURCE_PATH:$(pwd)/sorting_line_scene
export IGN_GAZEBO_RESOURCE_PATH=$IGN_GAZEBO_RESOURCE_PATH:$(pwd)/sorting_line_scene
逐行解释:
- 追加工程根目录到资源路径:这样
<uri>model://xxx</uri>与<include>更容易命中本地模型。 - 同时设置两个变量:兼容不同版本/插件对环境变量命名的差异。
验证(可截图留证):
echo $GZ_SIM_RESOURCE_PATH
逐行解释:
- 输出中应包含你的
.../sorting_line_scene路径;否则说明环境变量没有生效(常见于新开终端后未重新 export)。
配套项目对齐(03_sorting_line_scene)
如果你使用的是课程提供的配套项目,请直接使用下面目录(已按本结构预置):
03_sorting_line_scene/
sorting_line_scene/
worlds/
models/
docs/
快速启动(推荐先跑最小闭环,再跑含设备版):
cd 03_sorting_line_scene/sorting_line_scene
export GZ_SIM_RESOURCE_PATH=$GZ_SIM_RESOURCE_PATH:$(pwd)
export IGN_GAZEBO_RESOURCE_PATH=$IGN_GAZEBO_RESOURCE_PATH:$(pwd)
ign gazebo -v 4 worlds/sorting_line_full.world
# 或:包含 UR5e/AGV/分拣箱占位模型的整线骨架
ign gazebo -v 4 worlds/sorting_line_full_with_devices.world
逐行解释:
cd .../sorting_line_scene:进入工程根目录,保证worlds/与models/的相对关系稳定。export ...:$(pwd):把工程根目录加入资源路径,使model://conveyor_basic等引用可解析。sorting_line_full.world:最小可运行闭环(传送带 + 物料球体),用于先验证“能加载、物理稳定、证据链可截图”。sorting_line_full_with_devices.world:整线骨架(含 UR5e/AGV/分拣箱占位模型 + 苹果占位模型),用于验证“多设备同场景加载与布局”。
- UR5e:完成模型导入与基础适配(关节限位正确、安装位姿正确、关键坐标系明确)。
- 传送带:完成模型创建(几何/碰撞/摩擦)与速度调控(能做到“改一个参数,速度变化可验证”)。
- AI:完成 1 次“生成 SDF/URDF 模板并自检”的闭环(生成不等于可用,必须审计与运行验证)。
- 保底(推荐,先跑起来):使用“已准备好的 UR5e 模型包”(教师发放或课程素材),直接放入
sorting_line_scene/models/ur5e/,确保能被 Gazebo 加载。 - 进阶(用于参数校准与后续 ROS2 控制衔接):在 URDF 中校准关节限位与运动学参数,并保持“改动可追溯”(记录改了什么、为什么、如何验证)。
本不强制你获取模型的来源,但强制你满足“模型目录结构与资源可解析”。
2. 模型目录结构(Gazebo Standalone Model 结构)
把 UR5e 放到下面结构(目录名可用 ur5e):
sorting_line_scene/
models/
ur5e/
model.config
model.sdf
meshes/
...
解释要点:
model.config:模型元信息(名字、版本、入口文件)。meshes/:网格资源;model.sdf中引用网格路径必须能解析到这里。
一个最小可用 model.config(复制即可用):
<?xml version="1.0"?>
<model>
<name>ur5e</name>
<version>1.0</version>
<sdf version="1.8">model.sdf</sdf>
<author>
<name>course</name>
<email>n/a</email>
</author>
<description>UR5e model for sorting line lab</description>
</model>
逐段解释:
-
<name>:模型名;后续在 world 中用<uri>model://ur5e</uri>引用。 -
<sdf ...>:指定入口 SDF 文件名;常见错误是写错文件名导致加载失败。 -
对应文件:
03_sorting_line_scene/sorting_line_scene/models/ur5e/model.config
<?xml version="1.0"?>
<model>
<name>ur5e</name>
<version>0.1</version>
<sdf version="1.8">model.sdf</sdf>
<author>
<name>course</name>
<email>n/a</email>
</author>
<description>UR5e placeholder model for world integration</description>
</model>
- 对应文件:
03_sorting_line_scene/sorting_line_scene/models/ur5e/model.sdf
<?xml version="1.0"?>
<sdf version="1.8">
<model name="ur5e">
<static>true</static>
<pose>0 0 0 0 0 0</pose>
<link name="base_link">
<inertial>
<mass>30.0</mass>
<inertia>
<ixx>1.0</ixx>
<iyy>1.0</iyy>
<izz>1.0</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="base_collision">
<geometry>
<cylinder>
<radius>0.12</radius>
<length>0.18</length>
</cylinder>
</geometry>
</collision>
<visual name="base_visual">
<geometry>
<cylinder>
<radius>0.12</radius>
<length>0.18</length>
</cylinder>
</geometry>
</visual>
</link>
</model>
</sdf>
逐段解释(为什么占位模型也要写惯性与碰撞体):
- 占位模型的目标是“可加载、可碰撞、可选中查看 pose”,因此仍要包含
collision + inertial,避免出现物理异常或 GUI 属性不完整。 - 后续替换为真实 UR5e 时,保持
model://ur5e引用不变,只替换该目录下的模型文件,便于团队协作与版本对齐。
3. UR5e 在 world 中摆放:安装位姿与坐标系对齐
在 sorting_line_scene/worlds/sorting_line_full.world(后续会创建)里引用 UR5e:
<include>
<uri>model://ur5e</uri>
<name>ur5e_01</name>
<pose>0.0 -0.6 0.0 0 0 1.5708</pose>
</include>
逐段解释:
-
<uri>:引用本地模型库里的ur5e。 -
<name>:给实例起名(同一个模型可放多个实例,实例名必须不同)。 -
<pose>:x y z roll pitch yaw(单位:米、弧度)。示例把 UR5e 放在传送带左侧,绕 z 轴旋转 90°(1.5708 rad)。 -
在 Gazebo GUI 的 Entity Tree 里能看到
ur5e_01; -
选中
ur5e_01后查看 pose 与期望一致(位置/朝向不反)。
4. 关节限位适配:只改“必要字段”,并能自证正确
如果你的 UR5e 模型来自 URDF(或你需要修正关节限位),你要会定位并修改每个关节的 <limit> 字段。
示例(URDF 片段):一个转动关节(revolute)限位写法
<joint name="shoulder_pan_joint" type="revolute">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0.089159" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-6.283185" upper="6.283185" effort="150.0" velocity="3.15"/>
</joint>
逐段解释:
<origin xyz rpy>:该关节相对父链的坐标变换(运动学链条的“骨架”关键)。<axis xyz>:转轴方向;写错会导致运动方向不符合真实机构。<limit lower upper>:关节角度上下限(单位:弧度)。典型错误是把“度”当成“弧度”写进去,导致限位离谱。- 注意:示例里的
lower/upper仅用于演示字段位置与单位;实际 UR5e 的关节限位应以厂商参数/权威 URDF 为准,避免仿真可动范围与真实设备不一致。
- GUI 自检:在 Gazebo 中逐个拖动关节(或用关节控制面板),观察是否会越过限位或出现“反向折叠”的异常。
- 数据自检:记录一个关节的最小/最大可达角度(截图或记录),对照你写的
lower/upper是否一致。
5. 运动学参数校准:用“可复现对比”而不是主观感觉
- UR5e 的基座(base)落在你定义的安装点;
- 末端(tool)指向方向与真实 UR5e 工作习惯一致(例如 tool z 轴朝向抓取方向);
- 关键尺寸(link 长度)与官方尺寸量级一致,避免出现“伸长/缩短明显”的错觉。
最小校准流程(建议按此顺序):
- 固定世界坐标系:在布局草图上写清
W的原点与轴向,并在 world 里把 UR5e pose 锁定到草图位置。 - 校准基座:优先校准
base_link到世界的pose(不先改 URDF 内部骨架)。 - 再校准骨架:只在确有证据时改
<origin xyz rpy>,每次改动后立刻验证(小步快跑)。
1. 传送带模型:先做“稳定可运送”的简化结构
- 几何层:可视化外观(visual)可以简单;
- 物理层:碰撞体(collision)必须简化且参数合理(摩擦、质量、碰撞形状)。
在 sorting_line_scene/models/conveyor_basic/ 创建模型结构:
sorting_line_scene/
models/
conveyor_basic/
model.config
model.sdf
一个最小可用 conveyor_basic/model.config(复制即可用):
<?xml version="1.0"?>
<model>
<name>conveyor_basic</name>
<version>1.0</version>
<sdf version="1.8">model.sdf</sdf>
<author>
<name>course</name>
<email>n/a</email>
</author>
<description>Basic conveyor geometry for lab</description>
</model>
逐段解释:
<name>:模型名;后续在 world 中用<uri>model://conveyor_basic</uri>引用。<sdf ...>:入口文件名必须与实际文件一致,否则会出现“模型存在但加载失败”的问题。
conveyor_basic/model.sdf(可直接运行的最小传送带模型):
<?xml version="1.0"?>
<sdf version="1.8">
<model name="conveyor_basic">
<static>true</static>
<link name="belt_link">
<collision name="belt_collision">
<geometry>
<box><size>2.0 0.5 0.1</size></box>
</geometry>
<surface>
<friction>
<ode>
<mu>0.9</mu>
<mu2>0.9</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="belt_visual">
<geometry>
<box><size>2.0 0.5 0.1</size></box>
</geometry>
</visual>
</link>
</model>
</sdf>
逐段解释:
-
<collision>:碰撞体用box简化,避免网格碰撞体导致的抖动/卡顿。 -
把“传送带速度”定义为
belt_speed; -
通过为物料(苹果)设置初始速度与持续运动策略,得到“沿传送带方向运送”的可观察现象;
在后续的 world 中,我们将把 belt_speed 写成一个明确常量,并要求你们记录:修改前后速度与现象差异。
AI 辅助提醒(重要):
- AI 生成的“传送带插件配置”可能与当前 Gazebo 版本不匹配;任何涉及插件
filename的内容都必须以你的环境实际日志为准。
- 快问快答:UR5e 的
pose里 yaw 用的是什么单位?关节限位lower/upper用的是什么单位?传送带碰撞体为什么不推荐直接用高精网格?
- 保底(必做):AGV 模型能被加载,碰撞体/质量合理;能沿“给定航路点列表”移动(哪怕是简化的等速直线 + 转向)。
- 进阶(选做):对接 ROS2(如
/cmd_vel、Nav2)并实现更规范的路径跟随;本给出接口形态与最小验证方法,但不强制全班完成。
2. AGV 模型导入:目录结构与 world 引用
建议把 AGV 模型放到:
sorting_line_scene/
models/
agv_basic/
model.config
model.sdf
meshes/
...
- 对应文件:
03_sorting_line_scene/sorting_line_scene/models/agv_basic/model.config
<?xml version="1.0"?>
<model>
<name>agv_basic</name>
<version>0.1</version>
<sdf version="1.8">model.sdf</sdf>
<author>
<name>course</name>
<email>n/a</email>
</author>
<description>AGV placeholder model for world integration</description>
</model>
- 对应文件:
03_sorting_line_scene/sorting_line_scene/models/agv_basic/model.sdf
<?xml version="1.0"?>
<sdf version="1.8">
<model name="agv_basic">
<static>true</static>
<pose>0 0 0 0 0 0</pose>
<link name="base_link">
<inertial>
<mass>80.0</mass>
<inertia>
<ixx>2.0</ixx>
<iyy>6.0</iyy>
<izz>7.0</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="chassis_collision">
<geometry>
<box><size>0.8 0.5 0.25</size></box>
</geometry>
</collision>
<visual name="chassis_visual">
<geometry>
<box><size>0.8 0.5 0.25</size></box>
</geometry>
</visual>
</link>
</model>
</sdf>
逐段解释:
- 占位模型用
box简化车体碰撞体,优先保证接触稳定与运行性能。 - 后续替换为真实 AGV 时,保持
model://agv_basic引用不变,只替换该目录下的模型文件。
在 world 中引用(示例):
<include>
<uri>model://agv_basic</uri>
<name>agv_01</name>
<pose>-1.5 0.8 0.0 0 0 0</pose>
</include>
逐段解释:
- 把 AGV 初始位置放在传送带上游或侧边通道,避免一开始就与设备碰撞。
z建议为0.0,让车体落到地面;如果模型悬空或陷地,优先检查碰撞体尺寸与模型原点位置。
3. 航路点路径(保底实现):用“可复现”的 waypoints 描述
P1 (-1.5, 0.8) → P2 (1.5, 0.8) → P3 (1.5, -0.8) → P4 (-1.5, -0.8) → P1
解释要点:
-
坐标与 world 坐标一致(x 向前、y 向左);必须与你们的布局草图一致。
-
路径规划最先要解决的是“坐标系一致 + 可重复走到”,而不是追求最优曲线。
-
先在 GUI 中手动拖动 AGV 到 P2/P3/P4,验证路径是否可行(不会穿模/卡死)。
-
再把“移动”变成可复现:给出每段的速度与时间,能在同样参数下重复观察相同行为。
1. 为什么苹果的“碰撞体”要简化
苹果网格通常比较复杂。直接用高精网格做碰撞体常见后果:
-
物理接触不稳定(抖动、弹飞、穿透)。
-
性能变差(每帧碰撞计算负载大,掉帧导致连锁不稳定)。
-
视觉可以精细(visual 用网格)。
-
碰撞必须简化(collision 用球/椭球/盒子组合),并优先保证稳定。
2. 苹果模型目录结构与最小 model.config
占位版(推荐先跑通,配套项目默认采用该结构):
sorting_line_scene/
models/
apple_mesh/
model.config
model.sdf
网格版(进阶,可在占位版稳定后再替换为网格视觉):
sorting_line_scene/
models/
apple_mesh/
model.config
model.sdf
meshes/
apple.stl
最小 model.config(复制即可用):
<?xml version="1.0"?>
<model>
<name>apple_mesh</name>
<version>1.0</version>
<sdf version="1.8">model.sdf</sdf>
<author>
<name>course</name>
<email>n/a</email>
</author>
<description>Apple mesh with simplified collision</description>
</model>
配套项目(03_sorting_line_scene)默认的 model.config(与占位版 model.sdf 对齐):
<?xml version="1.0"?>
<model>
<name>apple_mesh</name>
<version>1.0</version>
<sdf version="1.8">model.sdf</sdf>
<author>
<name>course</name>
<email>n/a</email>
</author>
<description>Apple model placeholder with stable simplified collision</description>
</model>
3. 苹果 model.sdf:占位版(配套项目默认,确保稳定可跑)
apple_mesh/model.sdf(可直接引用到 world):
<?xml version="1.0"?>
<sdf version="1.8">
<model name="apple_mesh">
<static>false</static>
<link name="link">
<inertial>
<mass>0.18</mass>
<inertia>
<ixx>0.00018</ixx>
<iyy>0.00018</iyy>
<izz>0.00018</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<sphere><radius>0.045</radius></sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0.6</mu>
<mu2>0.6</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<sphere><radius>0.045</radius></sphere>
</geometry>
</visual>
</link>
</model>
</sdf>
逐段解释(你必须能讲清“为什么这么配”):
collision用sphere:稳定优先。视觉网格再精细也不影响碰撞稳定性。mu/mu2:摩擦系数初值。若发现“太滑运不动/太粘抖动”,要按现象回调并记录证据链。
补充说明(为什么配套项目先用占位版):
网格版(进阶:视觉用网格,碰撞仍用球体;当你已经准备好 meshes/apple.stl 时再采用):
<visual name="visual">
<geometry>
<mesh>
<uri>model://apple_mesh/meshes/apple.stl</uri>
</mesh>
</geometry>
</visual>
逐段解释:
- 只替换
visual,不替换collision,这是工业仿真常用做法:视觉精细、碰撞简化。 <uri>使用model://apple_mesh/...:跨机器/跨目录更稳定,减少资源路径错误。
1. 创建整线 world 文件(建议名:sorting_line_full.world)
cd sorting_line_scene
mkdir -p worlds
逐行解释:
cd sorting_line_scene:进入工程根目录,确保相对资源路径一致。mkdir -p worlds:创建 world 文件存放目录。
worlds/sorting_line_full.world(骨架示例,按组号修改 pose 与实例名即可运行):
<?xml version="1.0" ?>
<sdf version="1.8">
<world name="sorting_line_full_world">
<physics name="fast_stable" type="ode">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
<real_time_update_rate>1000</real_time_update_rate>
</physics>
<gravity>0 0 -9.8</gravity>
<include>
<uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground%20Plane</uri>
</include>
<include>
<uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun</uri>
</include>
<include>
<uri>model://conveyor_basic</uri>
<name>conveyor_01</name>
<pose>0 0 0 0 0 0</pose>
</include>
<include>
<uri>model://ur5e</uri>
<name>ur5e_01</name>
<pose>0.0 -0.6 0.0 0 0 1.5708</pose>
</include>
<include>
<uri>model://agv_basic</uri>
<name>agv_01</name>
<pose>-1.5 0.8 0.0 0 0 0</pose>
</include>
<include>
<uri>model://apple_mesh</uri>
<name>apple_01</name>
<pose>-0.9 0.0 0.25 0 0 0</pose>
</include>
</world>
</sdf>
逐段解释(只解释你必须会用到的关键点):
conveyor_basic / ur5e / agv_basic / apple_mesh:均通过model://引用本地模型;加载失败优先看资源路径与模型目录结构。apple_01 pose:把苹果放到传送带上方 0.25m,避免一开始与传送带碰撞体相交导致“弹飞”。
1.0 配套项目中的 world 文件(与本对齐的可运行版本)
配套项目提供两个可直接运行的 world,分别对应“最小闭环”和“整线骨架”。以下代码与项目文件保持一致:
worlds/sorting_line_full.world(最小闭环:传送带 + 物料球体,先验证稳定性):
<?xml version="1.0" ?>
<sdf version="1.8">
<world name="sorting_line_full_world">
<physics name="fast_stable" type="ode">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
<real_time_update_rate>1000</real_time_update_rate>
</physics>
<gravity>0 0 -9.8</gravity>
<include>
<uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground%20Plane</uri>
</include>
<include>
<uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun</uri>
</include>
<include>
<uri>model://conveyor_basic</uri>
<name>conveyor_01</name>
<pose>0 0 0 0 0 0</pose>
</include>
<model name="apple_sphere_test">
<static>false</static>
<pose>-0.9 0.0 0.25 0 0 0</pose>
<link name="link">
<inertial>
<mass>0.18</mass>
<inertia>
<ixx>0.00018</ixx>
<iyy>0.00018</iyy>
<izz>0.00018</izz>
<ixy>0</ixy>
<ixz>0</ixz>
<iyz>0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<sphere><radius>0.045</radius></sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0.6</mu>
<mu2>0.6</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="visual">
<geometry>
<sphere><radius>0.045</radius></sphere>
</geometry>
</visual>
</link>
</model>
</world>
</sdf>
逐段解释:
- 这个 world 不依赖 UR5e/AGV/网格苹果,适合先排除“模型包缺失/资源路径错误”。
- 若这一步都跑不起来,优先检查:网络(Fuel)、资源路径(
GZ_SIM_RESOURCE_PATH)、SDF 解析错误(-v 4日志)。
worlds/sorting_line_full_with_devices.world(整线骨架:含 UR5e/AGV/分拣箱占位模型 + 苹果占位模型):
<?xml version="1.0" ?>
<sdf version="1.8">
<world name="sorting_line_full_world">
<physics name="fast_stable" type="ode">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
<real_time_update_rate>1000</real_time_update_rate>
</physics>
<gravity>0 0 -9.8</gravity>
<include>
<uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground%20Plane</uri>
</include>
<include>
<uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun</uri>
</include>
<include>
<uri>model://conveyor_basic</uri>
<name>conveyor_01</name>
<pose>0 0 0 0 0 0</pose>
</include>
<include>
<uri>model://ur5e</uri>
<name>ur5e_01</name>
<pose>0.0 -0.6 0.0 0 0 1.5708</pose>
</include>
<include>
<uri>model://agv_basic</uri>
<name>agv_01</name>
<pose>-1.5 0.8 0.0 0 0 0</pose>
</include>
<include>
<uri>model://apple_mesh</uri>
<name>apple_01</name>
<pose>-0.9 0.0 0.25 0 0 0</pose>
</include>
<model name="bin_grade_a">
<static>true</static>
<pose>1.2 0.8 0.2 0 0 0</pose>
<link name="bin_link">
<collision name="bin_collision">
<geometry>
<box><size>0.4 0.4 0.4</size></box>
</geometry>
</collision>
<visual name="bin_visual">
<geometry>
<box><size>0.4 0.4 0.4</size></box>
</geometry>
</visual>
</link>
</model>
</world>
</sdf>
逐段解释:
- 当你拿到真实 UR5e/AGV 模型时,优先做法是“替换模型目录内容”而不是“改 world 引用”,这样便于保持场景文件稳定。
做法 A(推荐):把速度控制系统插件加到 apple_mesh/model.sdf
在 apple_mesh/model.sdf 的 <model> 内、<link> 之前插入:
<plugin
filename="ignition-gazebo-velocity-control-system"
name="gz::sim::systems::VelocityControl">
<initial_linear>0.7 0 0</initial_linear>
<initial_angular>0 0 0</initial_angular>
</plugin>
逐段解释:
initial_linear:初始线速度(单位 m/s)。你们把它视为belt_speed,例如0.7表示向 x 方向以 0.7 m/s 运送。
重要提醒(避免把“保底做法”误当成“工业实现”):
做法 B(备用):先用简化球体做“速度调控验证”,再替换为网格苹果
<model name="apple_sphere_test">
<static>false</static>
<pose>-0.9 0.0 0.25 0 0 0</pose>
<plugin
filename="ignition-gazebo-velocity-control-system"
name="gz::sim::systems::VelocityControl">
<initial_linear>0.7 0 0</initial_linear>
<initial_angular>0 0 0</initial_angular>
</plugin>
<link name="link">
<inertial><mass>0.18</mass></inertial>
<collision name="collision">
<geometry><sphere><radius>0.045</radius></sphere></geometry>
</collision>
<visual name="visual">
<geometry><sphere><radius>0.045</radius></sphere></geometry>
</visual>
</link>
</model>
逐段解释:
- 这个模型“只用于速度调控验证”,因此碰撞体与视觉都用球体,确保稳定。
运行(可截图留证):
ign gazebo -v 4 worlds/sorting_line_full.world
逐行解释:
-
-v 4:提高日志详细度,便于定位模型加载失败、资源找不到、解析错误等问题。 -
若 Fuel 模型加载慢:检查网络,或改为本地 Ground/Sun 模型并配置资源路径(前置已覆盖)。
-
模型可信度:关键设备优先使用厂商/官方模型与参数(UR 机械臂、AGV 车体尺寸/质量),自建模型要保留来源与版本号,并能解释“质量/惯性/碰撞体”的依据。
-
性能与稳定性:遵循“视觉精细、碰撞简化、参数标定”的工程路线,避免高精网格直接做碰撞体导致实时性下降与接触不稳定。
本章 AI 使用的统一要求:带约束提问 + 小步验证 + 证据链闭环(提示词—输出—你采用的修改—运行验证)。
1. 生成设备 SDF/URDF 模板(可直接复制的提示词)
你要检查的点(人工审计清单):
- AI 是否把“度”写进了弧度字段(常见错误)。
- AI 是否给出了“缺失 inertial / inertia 全 0”的模型(常导致仿真异常)。
- AI 是否给了无法在你环境找到的插件
filename(出现就先删插件,先跑通模型骨架)。
2. 物理参数优化(可直接复制的提示词)
我在 Gazebo Fortress 中做分拣产线仿真。现象:
(粘贴现象:打滑/抖动/弹飞/穿透/掉帧)。当前参数如下:(粘贴 physics、质量、摩擦、碰撞体形状)。请给出:1)最可能的 3 个原因(按概率排序);2)每个原因对应的最小改动方案(一次只改 1-2 个参数);3)每个改动的预期现象;4)如何验证(给出可截图的证据点)。
3. 模型加载报错排查(可直接复制的提示词)
-
最小闭环运行证据:运行
worlds/sorting_line_full.world,提交 1 张“终端无解析错误”截图 + 1 张“GUI 场景”截图。 -
整线骨架运行证据:运行
worlds/sorting_line_full_with_devices.world,提交 1 张“Entity Tree 关键实体可见”截图(conveyor_01/ur5e_01/agv_01/apple_01/bin_grade_a)。 -
参数对比证据:提交 1 组“参数修改前/后 + 现象差异”的对比记录(截图 + 1 句话解释),参数可选:摩擦(
mu/mu2)、质量(mass)、碰撞半径(radius)。 -
AI 协同证据:提交 1 次 AI 交互记录(提示词 + 关键输出 + 你采用的最小改动点 + 运行验证证据)。
-
生成 1 个设备的建模模板(SDF/URDF 均可):至少包含 1 个你们最终实际运行成功的模型文件(可选:传送带/苹果/AGV 占位模型)。
-
针对 1 个模型加载/参数报错:AI 分析原因并给出修改方案;你们选择其中 1 个方案落地并验证。
-
结合场景需求做 1 组物理参数优化并对比(例如摩擦或质量/惯性),提交“修改前/后 + 现象 + 证据”。
-
生成协同仿真测试要点清单,并补充你们场景特有的 1–2 条测试项(选做加分)。
课后作业(布置)
- 提交分拣产线仿真场景文件(
.world/.sdf/.urdf),附场景布局说明文档(150 字左右)。 - 提交各设备协同仿真测试截图(含设备运动状态、仿真界面),记录测试中发现的问题及解决方法。
- 提交 AI 生成的建模代码、修改后的代码及优化说明(200 字左右),附完整 AI 交互记录。
Markdown 与代码自检清单(提交前必须过一遍)
-
标题层级连续(
#→##→###),无跳级。 -
所有代码块成对闭合,且语言标记正确(
bash/xml/text)。 -
所有 pose 都是
x y z roll pitch yaw,单位为米/弧度;关节限位为弧度;质量为 kg。 -
每个模型至少包含
collision + inertial;碰撞体优先简化几何,避免网格碰撞体直接上。 -
AI 产物均经过人工审计:单位、标签闭合、资源路径、惯性矩数量级合理;并附运行证据链。
-
Gazebo 官方文档:https://gazebosim.org/docs
-
SDF 规范与元素说明:https://sdformat.org/spec
-
ROS2 官方文档(Humble):https://docs.ros.org/en/humble/